home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / askcodes / source / askcodes.s < prev   
Text File  |  1999-08-31  |  38KB  |  1,609 lines

  1. *******************************************************************************
  2. *    ASK3/codeAアクセサリ  ASKCodes  V1.31
  3. *        Copyright 1998-99 by AIG-Soft
  4. *******************************************************************************
  5.  
  6.     .include    defines.mac
  7.     .include    pspdef.mac
  8.     .include    ask3.mac
  9.     .include    skey.mac
  10.     .cpu        68000
  11.  
  12. TimerC    equ        $45        * Timer-CのベクターNo
  13. EX68    equ        0        * EX68で動作可能にするかどうか(1=不可)
  14.  
  15. *******************************************************************************
  16. *    常駐ルーチン
  17. *******************************************************************************
  18. * 1998をわざわざテキストでなしにバイナリー化しているのは、テキストのみより
  19. * 誤った一致をしにくいから
  20.  
  21.     .text
  22.     .even
  23. KEEP_START:
  24.     * 常駐確認用識別子
  25. id:    .dc.b    'ASKCodes V1.31',19,99,'AIG-Soft',0
  26.  
  27. *******************************************************************************
  28. * ワーク1
  29. *******************************************************************************
  30. * このワークエリアは起動時に初期値が必要/初期化時に利用するものである。
  31. *
  32.     .even
  33. ACh        .dc.l    -1    * アクセサリアドレス(初期値-1<0)
  34.                 * 正常登録された時、ACh>=0になる(0,1,2,3...)
  35.  
  36. cd        .dc.w    JISKTOP    * 参照中コード
  37. ctop0        .dc.w    $ffff    * 現在ページトップコード
  38. plane0        .dc.l    0    * 画面退避バッファーアドレス plane0用
  39. plane1        .dc.l    0    * 画面退避バッファーアドレス plane1用
  40. vecTimerC0    .dc.l    0    * 組み込み時のTimer-Cベクターのアドレス
  41. first        .dc.b    1    * 最初と最後の印(0,1,2)
  42. ftimerc        .dc.b    $00    * =0:止めない , !=0:止める
  43.  
  44. *******************************************************************************
  45. * メッセージ
  46. *******************************************************************************
  47.  
  48. Sep        .dc.b    ' :',0
  49. None        .dc.b    '**',0
  50. MesTitle    .dc.b    '文字選択',0
  51. Hyou        .dc.b    '[ 文字コード表 ]',0
  52. * ScaleとKeysは同じ幅にすること
  53. Scale        .dc.b    ' -code-:-+0-+1-+2-+3-+4-+5-+6-+7-+8-+9-+A-+B-+C-+D-+E-+F- ',0
  54. Keys        .dc.b    ' [↑↓←→,RollUp/Down:移動,SPC:選択,BS/CLR:修正,CR:決定] ',0
  55.  
  56. * 文字種類メッセージ
  57. LenType        equ    10        * メッセージ長
  58. *              123456789  10    幅は全て揃えること(長さを変えたら上の10も変える)
  59. TypeHan        .dc.b     '半角文字 ',0
  60. TypeHalf    .dc.b     '1/2角文字',0
  61. TypeZen        .dc.b     '全角記号 ',0
  62. Type1        .dc.b     '第1水準 ',0
  63. Type12        .dc.b     '第1/2水準',0
  64. Type2        .dc.b     '第2水準 ',0
  65. TypeZG        .dc.b     '全角外字 ',0
  66. TypeU4        .dc.b     '1/4角上付',0
  67. TypeL4        .dc.b     '1/4角下付',0
  68. TypeHG        .dc.b     '半角外字 ',0
  69. WShurui        .dc.b    '<         :    /    >',0    * コード種類表示枠
  70. *             <         :SJIS/JIS >        * セパレーター'/'は毎回表示する
  71. *             012345678901234567890
  72. *                   1         2
  73.     .even
  74.  
  75. *******************************************************************************
  76. * 定数定義
  77. *******************************************************************************
  78.  
  79. SCLEN    equ    58        * Scaleの表示長さ=(sizeof(Scale)-1)
  80. CDWX    equ    (SCLEN+2)    * x幅(枠分を含む)
  81. CDWY    equ    (12+2+1+1+1)    * y幅:12行+上下SCALE+タイトル+キー操作+下枠
  82.  
  83. * 半角文字
  84. HANTOP        equ    $0020
  85. HANEND        equ    $00df
  86.  
  87. * 1/2角文字
  88. HAN2TOP        equ    $8020
  89. HAN2END        equ    $80df
  90.  
  91. * 記号
  92. JISKTOP        equ    $8140
  93. JISKEND        equ    $84be
  94. * $85xx,$86xx,$87xxブロックはサポートしない
  95.  
  96. * JIS第1水準は連続だからいいけど、
  97. JIS1TOP        equ    $889f        * JIS第1水準漢字先頭
  98. JIS1END        equ    $9872        * JIS第1水準漢字最終
  99.  
  100. * JIS第2水準は不連続だから困る
  101. JIS2TOP1    equ    $989f        * JIS第2水準漢字第1ブロック先頭
  102. JIS2END1    equ    $9ffc        * JIS第2水準漢字第1ブロック最終
  103. JIS2TOP2    equ    $e040        * JIS第2水準漢字第2ブロック先頭
  104. JIS2END2    equ    $eaa2        * JIS第2水準漢字第2ブロック最終
  105.  
  106. * 全角外字
  107. JISGTOP        equ    $eb9f
  108. JISGEND        equ    $ecfc
  109.  
  110. * 1/4角文字
  111. HAN4TOP1    equ    $f020    * 上付き
  112. HAN4END1    equ    $f1df
  113. HAN4TOP2    equ    $f220    * 下付き
  114. HAN4END2    equ    $f4df
  115.  
  116. * 半角外字
  117. HANGTOP        equ    $f420
  118. HANGEND        equ    $f5df
  119.  
  120. *******************************************************************************
  121. * サブルーチン
  122. *******************************************************************************
  123.  
  124. BREAKOFF:
  125. * d0のみ破壊
  126.     move.w    #-1,-(sp)    * read BREAK mode
  127.     DOS    _BREAKCK
  128.     move.w    d0,brksts
  129.     clr.w    -(sp)        * BREAK Cut
  130.     DOS    _BREAKCK
  131.     addq.w    #2*2,sp
  132.     rts
  133.  
  134. * BREAKOFFは下にある
  135. *------------------------------------------------------------------------------
  136.  
  137. isHankaku    macro    lbl
  138. * 入力:d7.w:文字コード , lbl=半角時の処理アドレス
  139.     cmp.w    #JISKTOP-1,d7
  140.     bcs    lbl    * <$813f:EndCode($823f-$100)で誤動作させないためJISKTOPにしない
  141.     cmp.w    #JISGEND,d7
  142.     bhi    lbl    * >JISGEND
  143.     .endm
  144.  
  145. *------------------------------------------------------------------------------
  146.  
  147. AndIf    macro    top,end
  148. * 入力:d7.w:文字コード
  149. * c>top && c<end ; end>topのこと
  150. local    L1
  151.     cmp.w    #top,d7
  152.     bls    L1        * c<=top
  153.     * c>top
  154.     cmp.w    #end,d7
  155.     bcs    1f        * c<end = c>top && c<end
  156. L1:
  157.     .endm
  158.  
  159. *---------------------------------------
  160.  
  161. NoneCode:
  162. * コードが存在しないところかどうかを調べる
  163. * 入力:d7.w=コード
  164. * 出力:d0.l: =0:存在する , <>0:存在しない
  165. * 破壊:d0
  166.     moveq.l    #1,d0        * return(1)のため
  167.     cmp.w    #HANTOP,d7
  168.     bcs    1f        * code<HANTOP
  169.     cmp.w    #HANGEND,d7
  170.     bhi    1f        * code>HANGEND
  171.     *
  172.     AndIf    HANEND,HAN2TOP
  173.     AndIf    HAN2END,JISKTOP
  174.     AndIf    JISKEND,JIS1TOP
  175.     AndIf    JIS1END,JIS2TOP1
  176.     AndIf    JIS2END1,JIS2TOP2
  177.     AndIf    JIS2END2,JISGTOP
  178.     AndIf    JISGEND,HAN4TOP1
  179.     *
  180.     isHankaku 2f        * 半角?
  181.     * 全角系
  182.     cmp.b    #$40,d7
  183.     bcs    1f        * <$40
  184.     cmp.b    #$7f,d7
  185.     beq    1f        * =$7f
  186.     cmp.b    #$fc,d7
  187.     bhi    1f        * >$fc
  188.     bra    10f        * return(0)
  189. *
  190. 2:    * 半角
  191.     cmp.b    #$20,d7
  192.     bcs    1f        * <$20
  193.     cmp.b    #$e0,d7
  194.     bcc    1f        * >=$e0
  195.     cmp.b    #$7f,d7
  196.     bcs    10f        * <$7f    ... return(0)
  197.     cmp.b    #$9f,d7
  198.     bls    1f        * <=$9f
  199. 10:    moveq.l    #0,d0        * return(0)
  200. 1:    rts
  201.  
  202. *------------------------------------------------------------------------------
  203.  
  204. TopCode:
  205. * 指定文字の含まれるページの先頭文字コードを返す
  206. * 入力:d7.w=コード
  207. * 出力:d7.w=ページ先頭文字コード
  208. * 破壊:d7,d0
  209.     moveq.l    #$20,d0        * 半角系
  210.     isHankaku @f
  211.     moveq.l    #$40,d0        * 全角系
  212. @@:    and.l    #$ff00,d7
  213.     move.b    d0,d7
  214.     rts
  215.  
  216. *---------------------------------------
  217.  
  218. EndCode:
  219. * 指定文字の含まれるページの最終文字コードを返す
  220. * 入力:d7.w=コード
  221. * 出力:d7.w=ページ最終文字コード
  222. * 破壊:d7,d0
  223.     moveq.l    #$df,d0        * 半角系
  224.     isHankaku @f
  225.     moveq.l    #$fc,d0        * 全角系
  226. @@:    and.l    #$ff00,d7
  227.     move.b    d0,d7        * ここが.bなのでmoveq.lで>=$80を代入しても良い
  228.     rts
  229.  
  230. *------------------------------------------------------------------------------
  231.  
  232. AreaTop    macro    end,top
  233. * 入力:d0.w:文字コード
  234. * if (c>end && c<top) cd=top ; end<topのこと
  235. local    L1
  236.     cmp.w    #end,d7
  237.     bls    L1        * c<=end
  238.     * c>end
  239.     cmp.w    #top,d7
  240.     bcc    L1        * c>=top
  241.     * c<top = c>end && c<top
  242.     move.w    #top,d7
  243.     rts
  244. L1:
  245.     .endm
  246.  
  247. *---------------------------------------
  248.  
  249. CodePlus:
  250. * 次のコードを返す
  251. * 入力:d7.w = 現在のコード
  252. * 出力:d7.w = 次のコード
  253. * 破壊:d0
  254.     addq.w    #1,d7        * cd++
  255.     AreaTop    0,HANTOP
  256.     AreaTop    HANEND,HAN2TOP
  257.     AreaTop    HAN2END,JISKTOP
  258.     AreaTop    JISKEND,JIS1TOP
  259.     AreaTop    JIS1END,JIS2TOP1
  260.     AreaTop    JIS2END1,JIS2TOP2
  261.     AreaTop    JIS2END2,JISGTOP
  262.     AreaTop    JISGEND,HAN4TOP1
  263.     *
  264.     isHankaku 2f        * 半角?
  265.     * 全角系
  266.     cmp.b    #$7f,d7
  267.     bne    @f
  268.     addq.w    #1,d7        * if (cl==0x7f) cd++; // 存在しないコードを飛ばす
  269.     rts
  270. *
  271. @@:    cmp.b    #$fd,d7        * if (cl>=0xfd) cd=TopCode(cd+0x100); // 次ブロックの先頭
  272.     bcs    @f        * <$fd
  273. 1:    add.w    #$100,d7
  274.     bsr    TopCode        * d0破壊
  275. @@:    rts
  276. *
  277. 2:    * 半角系
  278.     cmp.b    #$7f,d7        * if (cl==0x7f) cd+=0x21; // 存在しないコードを飛ばす
  279.     bne    @f
  280.     add.w    #$21,d7
  281.     rts
  282. *
  283. @@:    cmp.b    #$e0,d7        * if (cl>=0xe0) cd=TopCode(cd+0x100); // 次ブロックの先頭
  284.     bcc    1b        * >=$e0
  285.     rts
  286.  
  287. *------------------------------------------------------------------------------
  288.  
  289. AreaEnd    macro    top,end
  290. * 入力:d0.w:文字コード
  291. * if (c>end && c<top) cd=end ; end<topのこと
  292. local    L1
  293.     cmp.w    #end,d7
  294.     bls    L1        * c<=end
  295.     * c>end
  296.     cmp.w    #top,d7
  297.     bcc    L1        * c>=top
  298.     * c<top = c>end && c<top
  299.     move.w    #end,d7
  300.     rts
  301. L1:
  302.     .endm
  303.  
  304. *---------------------------------------
  305.  
  306. CodeMinus:
  307. * 前のコードを返す
  308. * 入力:d7.w = 現在のコード
  309. * 出力:d7.w = 前のコード
  310. * 破壊:d0
  311.     subq.w    #1,d7        * cd--
  312.     AreaEnd    $ffff,HANGEND
  313.     AreaEnd    HAN4TOP1,JISGEND
  314.     AreaEnd    JISGTOP,JIS2END2
  315.     AreaEnd    JIS2TOP2,JIS2END1
  316.     AreaEnd    JIS2TOP1,JIS1END
  317.     AreaEnd    JIS1TOP,JISKEND
  318.     AreaEnd    JISKTOP,HAN2END
  319.     AreaEnd    HAN2TOP,HANEND
  320.     *
  321.     isHankaku 2f        * 半角?
  322.     * 全角系
  323.     cmp.b    #$7f,d7
  324.     bne    @f
  325.     subq.w    #1,d7        * if (cl==0x7f) cd--; // 存在しないコードを飛ばす
  326.     rts
  327. *
  328. @@:    cmp.b    #$40,d7        * if (cl<0x40) cd=EndCode(cd-0x100); // 前ブロックの最後
  329.     bcc    @f        * >=$40
  330. 1:    sub.w    #$100,d7
  331.     bsr    EndCode        * d0破壊
  332. @@:    rts
  333. *
  334. 2:    * 半角系
  335.     cmp.b    #$9f,d7        * if (cl==0x9f) cd-=0x21; // 存在しないコードを飛ばす
  336.     bne    @f
  337.     sub.w    #$21,d7
  338.     rts
  339. *
  340. @@:    cmp.w    #$20,d7        * if (cl<0x20) cd=EndCode(cd-0x100); // 前ブロックの最後
  341.     bcs    1b        * <$20
  342.     rts
  343.  
  344. *------------------------------------------------------------------------------
  345.  
  346. B_PRINT_HEX4:
  347. * d7.wを16進4桁で表示する
  348. * 入力:d7.w
  349. * 破壊:d0,d1,d2
  350.     move.w    d7,d1
  351.     lsr.w    #8,d1        * 上位8ビット
  352.     bsr    B_PRINT_HEX2
  353.     move.w    d7,d1        * 下位8ビット
  354. B_PRINT_HEX2:
  355. * codeを16進2桁で表示する
  356. * 入力:d1.b
  357. * 破壊:d0,d1,d2
  358.     move.b    d1,d2        * 保存
  359.     lsr.w    #4,d1        * 上位4ビット(本当は.bでいい)
  360.     bsr    @f
  361.     *
  362.     move.b    d2,d1
  363. @@:    and.b    #$0f,d1
  364.     *
  365.     add.b    #'0',d1
  366.     cmp.b    #'9',d1        * '9'>?
  367.     bls    @f        * <='9' ($0~$9)
  368.     * $A~$F
  369.     add.b    #'A'-10-'0',d1
  370. @@:    IOCS    _B_PUTC
  371.     rts
  372.  
  373. *------------------------------------------------------------------------------
  374.  
  375. CmpSkip    macro    code
  376.     cmp.w    #code,d5
  377.     bcs    1f
  378.     lea    LenType(a1),a1            * 次の文字種へ;フラグは破壊しない
  379.     .endm
  380.  
  381. *---------------------------------------
  382.  
  383. CodeType:
  384. * 文字種別を返す
  385. * 入力:d5.w = ctop
  386. * 出力:a1.l = 文字種類メッセージアドレス
  387.     lea    TypeHan(opc),a1
  388.     *
  389.     CmpSkip    HAN2TOP
  390.     CmpSkip    JISKTOP
  391.     CmpSkip    (JIS1TOP.and.$ff00).or.$40    * TopCode(JIS1TOP)相当
  392.     CmpSkip    (JIS1END.and.$ff00).or.$40    * TopCode(JIS1END)相当
  393.     beq    1f
  394.     lea    LenType(a1),a1
  395.     cmp.w    #(JIS2END2.and.$ff00).or.$40,d5    * TopCode(JIS2END2)相当
  396.     bls    1f                * <=
  397.     lea    LenType(a1),a1
  398.     CmpSkip    HAN4TOP1
  399.     CmpSkip    HAN4TOP2
  400.     CmpSkip    HANGTOP
  401. 1:    rts
  402.  
  403. *------------------------------------------------------------------------------
  404.  
  405. Print1Page:
  406. * 1ページ分の文字コード表を表示する
  407. * 入力:d3.w=x
  408. *    d4.w=y
  409. *    d7.w=code
  410.     movem.l    d3-d7,-(sp)
  411.     move.w    d7,d5
  412.     bsr    EndCode            * cend(d7.w)=EndCode(d7.w)
  413.     exg    d7,d5            * d7.w=cd , d5.w=cend
  414.     
  415.     bsr    TopCode            * ctop(d7.w)=TopCode(d7.w)
  416.     cmp.w    ctop0(opc),d7
  417.     beq    10f            * ctop==ctop0 : ページ内移動のみ
  418.     * ページが変わる/強制再描画
  419.     move.w    d7,ctop0        * ctop記録
  420.     *
  421.     * コード種類表示
  422.     addq.w    #2,d3            * x+=2
  423.     move.w    d3,d1
  424.     add.w    #SCLEN/2+5,d1        * x+SCLEN/2+5
  425.     move.w    d4,d2
  426.     subq.w    #2,d2            * y-2
  427.     IOCS    _B_LOCATE        * (d1.w,d2.w)
  428.     bsr    CodeType        * a1.l <- (d5.w)
  429.     IOCS    _B_PRINT
  430.     *
  431. 1:    move.w    d3,d1            * x
  432.     move.w    d4,d2
  433.     addq.w    #1,d4            * y++
  434.     IOCS    _B_LOCATE        * (d1.w,d2.w)
  435.     bsr    B_PRINT_HEX4        * アドレス表示(d7.w)
  436.     lea    Sep(opc),a1
  437.     IOCS    _B_PRINT
  438.     
  439.     moveq.l    #16-1,d6
  440. 3:    moveq.l    #' ',d1
  441.     IOCS    _B_PUTC
  442.     move.l    d0,d2            * x0
  443.     *
  444.     bsr    NoneCode        * d0破壊
  445.     tst.l    d0
  446.     beq    2f
  447.     lea    None(opc),a1        * このコードには文字がない
  448.     IOCS    _B_PRINT
  449.     bra    @f
  450.     *
  451. 2:    move.w    d7,d1
  452.     IOCS    _B_PUTC            * B_PUTC()は2バイトコードok
  453.     swap    d0            * x1
  454.     swap    d2            * x0
  455.     sub.w    d2,d0
  456.     cmp.w    #1,d0
  457.     bne    @f
  458.     moveq.l    #' ',d1
  459.     IOCS    _B_PUTC            * 半角系文字のとき
  460. @@:    addq.w    #1,d7            * cd++
  461.     dbra    d6,3b
  462.     *
  463.     cmp.w    d5,d7
  464.     bls    1b            * cd<=cend
  465.     *
  466. 10:    movem.l    (sp)+,d3-d7
  467.     * ページ内での移動では再表示しない
  468.  
  469.     * カーソル位置の文字コードを表示する V1.1
  470.     move.w    d3,d1
  471.     add.w    #SCLEN/2+6+11,d1
  472.     move.w    d4,d2
  473.     subq.w    #2,d2
  474.     IOCS    _B_LOCATE        * (d1.w,d2.w)
  475.     bsr    B_PRINT_HEX4        * B_PRINT_HEX4(code); // S-JIS
  476.     
  477.     move.l    d7,-(sp)
  478.     moveq.l    #'/',d1
  479.     IOCS    _B_PUTC
  480.     move.w    d7,d1            * S-JIS
  481.     IOCS    _SFTJIS
  482.     tst.l    d0
  483.     bmi    @f            * <0:JISコードが存在しない文字のときはS-JISそのまま
  484.     move.w    d0,d7            * JISを表示のため
  485. @@:    bsr    B_PRINT_HEX4        * B_PRINT_HEX4(jis); // JIS
  486.     move.l    (sp)+,d7
  487.     
  488.     * 現在のページ内でそのコードの存在位置にカーソルを移動する
  489.     move.w    d7,d1            * code
  490.     sub.w    ctop0(opc),d1        * code-=ctop0
  491.     move.w    d1,d2
  492.     and.w    #$000f,d1        * code%16
  493.     move.w    d1,d0
  494.     add.w    d1,d1            * *2
  495.     add.w    d0,d1            * =*3
  496.     add.w    #8+1,d1
  497.     add.w    d3,d1            * +x
  498.     lsr.w    #4,d2            * code/16
  499.     add.w    d4,d2            * +y
  500.     IOCS    _B_LOCATE        * (d1.w,d2.w)
  501.     rts
  502.  
  503. *------------------------------------------------------------------------------
  504.  
  505. PrintCodes:
  506. regs    =    4*6            * d3-d7/a3
  507.     movem.l    d3-d7/a3,-(sp)
  508.     move.w    xx(opc),d3
  509.     move.w    yy(opc),d4
  510.     lea    cd(opc),a3
  511.     move.w    (a3),d7            * cd(.w)
  512.     addq.w    #1,d3            * x+1
  513.     addq.w    #2,d4            * y+2
  514.     move.w    #-1,ctop0        * ctop0=-1 for 強制再描画
  515.     moveq.l    #CACI_NORMAL,d6        * ret
  516.     *
  517. 10:    bsr    Print1Page        * 1ページ表示
  518.     *
  519.     * ASKに頼らずキー入力を行っている。一応可能なようである。
  520.     * 今回はどうしてもカーソル点滅をさせたいため、ASKからのキー入力が使えない。
  521.     *(独自にカーソルを作り出せばいいが面倒なので。)
  522.     IOCS    _OS_CURON        * カーソルon
  523.     moveq.l    #$0e,d1
  524.     IOCS    _BITSNS            * シフト系キーが押されているか
  525.     move.b    d0,d2            * sft
  526.     swap    d2            * d2.h.w
  527.     IOCS    _B_KEYINP
  528.     and.w    #$ff00,d0
  529.     move.w    d0,d2
  530.     IOCS    _OS_CUROF        * カーソルoff
  531.     moveq.l    #0,d5            * skip=0
  532.     lea    Jtable(opc),a0
  533.     bsr    SearchKeyJ        * key jump
  534.     * <- ここに戻ってくる
  535.     cmp.w    #SKesc0,d2
  536.     bne    10b
  537.     *
  538.     move.w    d7,(a3)            * cd=c
  539.     move.w    d6,d0            * ret
  540.     movem.l    (sp)+,d3-d7/a3
  541.     rts
  542.  
  543. *---------------------------------------
  544.  
  545. SearchKeyJ:
  546. * キーサーチ&ジャンプ
  547. * d2.w <- code
  548. * a0   <- jump table
  549. * 少なくともd0/d1/a0破壊
  550. @@:    move.l    (a0)+,d0    * jump|code
  551.     beq    @f        * -> end of table
  552.     cmp.w    d2,d0        * =code?
  553.     bne    @b        * no
  554.     swap    d0        * d0=jump
  555.     jmp    -4(a0,d0.w)    * 飛び先からrtsする
  556. *
  557. @@:    rts            * default
  558.  
  559. *---------------------------------------
  560.  
  561. Jtable:    * 各キー毎のジャンプテーブル(出てきやすい順に並べる)
  562.     * jump先(offset),code
  563.     .dc.w    Jleft-$,SKleft
  564.     .dc.w    Jright-$,SKright
  565.     .dc.w    Jrdown-$,SKrdown
  566.     .dc.w    Jup-$,SKup
  567.     .dc.w    Jrup-$,SKrup
  568.     .dc.w    Jdown-$,SKdown
  569.     .dc.w    Jhome-$,SKhome
  570.     .dc.w    Jdel-$,SKdel
  571.     *
  572.     .dc.w    Jf1-$,SKf1
  573.     .dc.w    Jf1-$,SKt10
  574.     .dc.w    Jf1-$,SKm1
  575.     .dc.w    Jf2-$,SKf2
  576.     .dc.w    Jf2-$,SKt20
  577.     .dc.w    Jf2-$,SKm2
  578.     .dc.w    Jf3-$,SKf3
  579.     .dc.w    Jf3-$,SKt30
  580.     .dc.w    Jf3-$,SKm3
  581.     .dc.w    Jf4-$,SKf4
  582.     .dc.w    Jf4-$,SKt40
  583.     .dc.w    Jf4-$,SKm4
  584.     .dc.w    Jf5-$,SKf5
  585.     .dc.w    Jf5-$,SKt50
  586.     .dc.w    Jf5-$,SKm5
  587.     .dc.w    Jf6-$,SKf6
  588.     .dc.w    Jf6-$,SKt60
  589.     .dc.w    Jf6-$,SKm6
  590.     .dc.w    Jf10-$,SKf10
  591.     .dc.w    Jf10-$,SKt00
  592.     .dc.w    Jf10-$,SKm0
  593.     *
  594.     .dc.w    Jbs-$,SKbs0
  595.     .dc.w    Jclr-$,SKclr
  596.     .dc.w    Jcr-$,SKcr0
  597.     .dc.w    Jcr-$,SKent0
  598.     .dc.w    Jspc-$,SKspc0
  599.     .dc.w    Jkigou-$,SKkigo
  600.     .dc.w    Jesc-$,SKesc0
  601.     *
  602.     .dc.w    0,0            * end of table
  603.  
  604. *---------------------------------------
  605.  
  606. Jleft: * 前
  607.     cmp.w    #HANTOP,d7
  608.     bls    @f
  609.     bsr    CodeMinus    * d7
  610. @@:    rts
  611.  
  612. Jright:    * 次
  613.     cmp.w    #HANGEND,d7
  614.     bcc    @f
  615.     bsr    CodePlus    * d7
  616. @@:    rts
  617.  
  618. *---------------------------------------
  619.  
  620. Jrdown:    * 前ページ
  621.     cmp.w    #HANEND,d7    * すでに$00xxを表示している時は前ページ無し
  622.     bls    1f        * C版はintなので不要だが、.s版は.wなので必要
  623.     move.w    #$100-$10,d5
  624. Jup:    * 前行
  625.     add.w    #$10,d5
  626.     move.w    d7,d0        * c
  627.     sub.w    d5,d0        * c-skip
  628.     cmp.w    #HANTOP,d0
  629.     bcs    1f        * if (c-skip<HANTOP) break;
  630.     sub.w    d5,d7        * c-=skip;
  631. @@:    move.w    d7,d0        * c
  632.     sub.w    #$10,d0        * c-$10
  633.     cmp.w    #HANTOP,d0
  634.     bls    1f        * if (c-$10<=HANTOP) break;
  635.     bsr    NoneCode
  636.     tst.l    d0
  637.     beq    1f
  638.     sub.w    #$10,d7
  639.     bra    @b
  640.     *
  641. 1:    rts
  642. *
  643. Jrup:    * 次ページ
  644.     move.w    #$100-$10,d5
  645. Jdown:    * 次行
  646.     add.w    #$10,d5
  647.     move.w    d7,d0        * c
  648.     add.w    d5,d0        * c+skip
  649.     cmp.w    #HANGEND,d0
  650.     bhi    1f        * if (c+skip>HANGEND) break;
  651.     add.w    d5,d7        * c+=skip;
  652. @@:    move.w    d7,d0        * c
  653.     add.w    #$10,d0        * c+$10
  654.     cmp.w    #HANGEND,d0
  655.     bcc    1f        * if (c+$10>=HANGEND) break;
  656.     bsr    NoneCode
  657.     tst.l    d0
  658.     beq    1f
  659.     add.w    #$10,d7
  660.     bra    @b
  661.     *
  662. 1:    rts
  663.  
  664. *---------------------------------------
  665.  
  666. Jhome:    * ページ先頭
  667.     bsr    TopCode
  668.     cmp.w    #HANTOP,d7
  669.     bcc    @f        * >
  670.     move.w    #HANTOP,d7
  671. @@:    rts
  672. *
  673. Jdel:    * ページ最終
  674.     bsr    EndCode
  675.     cmp.w    #HANGEND,d7
  676.     bls    @f        * <=
  677.     move.w    #HANGEND,d7
  678. @@:    rts
  679.  
  680. *---------------------------------------
  681.  
  682. Jf1:    * 第1水準漢字へ飛ぶ
  683.     move.l    #JIS1TOP<<16|JIS1END,d1
  684.     bra    f00
  685. *
  686. Jf2:    * 第2水準漢字へ飛ぶ
  687.     move.l    #JIS2TOP1<<16|JIS2END2,d1
  688.     bra    f00
  689. *
  690. Jf3:    * 1/2角文字へ飛ぶ
  691.     move.l    #HAN2TOP<<16|HAN2END,d1
  692.     bra    f00
  693. *
  694. Jf4:    * 1/4角文字へ飛ぶ
  695.     move.l    #HAN4TOP1<<16|HAN4END2,d1
  696.     bra    f00
  697. *
  698. Jf5:    * 記号へ飛ぶ
  699.     move.l    #JISKTOP<<16|JISKEND,d1
  700.     bra    f00
  701. *
  702. Jf6:    * 外字へ飛ぶ
  703.     move.l    #JISGTOP<<16|JISGEND,d1
  704.     bra    f00
  705. *
  706. Jf10:    * 半角文字へ飛ぶ
  707.     move.l    #HANTOP<<16|HANEND,d1
  708. f00:    move.l    d2,d0
  709.     swap    d0        * d2.h.w -> d0.l.w (.b=sft)
  710.     and.w    #SKsft|SKopt1,d0
  711.     beq    @f
  712.     move.w    d1,d7        * end
  713.     rts
  714.     *
  715. @@:    swap    d1
  716.     move.w    d1,d7        * top
  717.     rts
  718.  
  719. *---------------------------------------
  720.  
  721. Jbs:    * 入力ライン1文字消し
  722.     move.w    pt(opc),d0
  723.     beq    BEEP        * pt=0:入力無し
  724.     * pt>0
  725.     subq.w    #1,d0        * pt--
  726.     move.w    d0,pt
  727.     lea    pts(opc),a0
  728.     moveq.l    #0,d1        * for .b = .w
  729.     move.b    (a0,d0.w),d1    * pts[pt]
  730.     sub.w    d1,ptb        * ptb-=pts[pt];
  731.     move.w    ptb(opc),d0
  732.     lea    cbuf(opc),a0
  733.     clr.b    (a0,d0.w)    * cbuf[ptb]=0;
  734.     bra    COUT
  735.     *
  736. BEEP:    moveq.l    #7,d1
  737.     IOCS    _B_PUTC        * BEEP
  738.     rts
  739. *
  740. Jclr:    * 入力ライン消し
  741.     clr.b    cbuf        * cbuf[0]=0
  742.     clr.w    pt
  743.     clr.w    ptb
  744.     bra    COUT
  745.  
  746. *---------------------------------------
  747.  
  748. Jcr:    * コードを返す
  749.     move.b    #1,first
  750.     tst.w    pt
  751.     beq    Jspc
  752.     * pt>0
  753.     move.w    #DF_OUTSTR|CACI_END,d6    * 文字列出力
  754.     move.w    #SKesc0,d2
  755.     rts
  756.     *
  757.     * pt=0のときは現在カーソル位置の1文字を持ってリターン
  758. Jspc:    * 1文字選択
  759.     moveq.l    #1,d1
  760.     cmp.w    #$ff,d7        * cs=1+(c>0xff); // 今ストアする文字のバイト数
  761.     bls    @f
  762.     addq.w    #1,d1
  763. @@:    * 今のコードは入る?
  764.     move.w    d1,d0
  765.     add.w    ptb(opc),d0    * cs+ptb
  766.     addq.w    #1,d0        *       +1
  767.     cmp.w    #C_SIZE-1,d0
  768.     bcc    BEEP        * if (ptb+cs+1>=C_SIZE-1) バッファーオーバー
  769.     * 今のコードを入れる
  770.     lea    pts(opc),a0
  771.     move.w    pt(opc),d0
  772.     move.b    d1,(a0,d0.w)    * pts[pt++]=cs;
  773.     addq.w    #1,d0
  774.     move.w    d0,pt
  775.     *
  776.     move.w    ptb(opc),d0
  777.     lea    cbuf(opc),a0
  778.     lea    (a0,d0.w),a0    * cbuf[ptb]
  779.     cmp.b    #2,d1        * cs==2?
  780.     bne    @f        * No = 1バイト文字
  781.     move.w    d7,d1
  782.     lsr.w    #8,d1
  783.     move.b    d1,(a0)+    * if (cs==2) cbuf[ptb++]=(unchar)(c>>8);
  784.     addq.w    #1,d0
  785. @@:    move.b    d7,(a0)+    * cbuf[ptb]=(unchar)c;
  786.     addq.w    #1,d0        * ptb++
  787.     clr.b    (a0)+        * cbuf[ptb]=0; // EOS
  788.     move.w    d0,ptb
  789.     cmp.w    #HANGEND,d7    * if (c<HANGEND) c=CodePlus(c); // コードを+1する
  790.     bcc    COUT        * >=
  791.     bsr    CodePlus    * d7
  792. COUT:    * ASKに戻して表示させる処理
  793.     cmp.w    #SKcr0,d2
  794.     beq    @f
  795.     cmp.w    #SKent0,d2
  796.     bne    1f
  797. @@:    * すでにcbufに入っているものを返すだけ
  798.     move.w    #DF_OUTSTR|CACI_END,d6        * CR/ENTERのときは終了
  799.     move.w    #SKesc0,d2            * first=1は代入済み
  800.     rts
  801.     *
  802. 1:    move.w    #DF_KWINSTR|CACI_URGENT,d6    * 直ぐに戻ってこさせるため
  803.     bsr    BREAKOFF
  804.     lea    cbuf(opc),a0
  805.     move.l    #kbuf,d0
  806.     moveq.l    #0,d1
  807.     bsr    Str2MEANS            * kbuf[Str2MEAN(cbuf,kbuf,0)] = 0;
  808.     move.w    #SKesc0,d2
  809. BREAKON:    * ここはサブルーチンでもある
  810. * d0のみ破壊
  811.     move.w    brksts(opc),-(sp)
  812.     DOS    _BREAKCK
  813.     addq.w    #2,sp
  814.     rts
  815.  
  816. *---------------------------------------
  817.  
  818. Jkigou:    move.w    #SKesc0,d2
  819. Jesc:    move.w    #CACI_END,d6
  820.     move.b    #1,first
  821.     rts
  822.  
  823. *---------------------------------------
  824.  
  825. Str2MEANS:
  826. * buf[Str2MEAN(mes,buf,mode)]=0
  827. * a0   <- mes
  828. * d0.l <- buf
  829. * d1.l <- mode (0=通常表示,1=反転表示)
  830.     move.l    d1,-(sp)    * mode
  831.     move.l    d0,-(sp)    * buf
  832.     pea    (a0)        * mes
  833.     pea    62.w
  834.     DOS    _KNJCTRL
  835.     lea    4*4(sp),sp
  836.     move.l    -8(sp),a0    * buf
  837.     add.w    d0,d0        * .w=MEAN
  838.     clr.w    (a0,d0.w)    * buf[..]=0
  839.     rts
  840.  
  841. *------------------------------------------------------------------------------
  842.  
  843. waku2:
  844. * void waku2(short sx,short sy, short wx, short wy,short plane)
  845. * 枠描画2    4    8    12    16    20
  846. regs    =    4*4            * d3-d6
  847.     movem.l    d3-d6,-(sp)        * 4*4
  848.     lea    Twork(opc),a1
  849.     move.w    20+2+regs(sp),d2    * plane
  850.     moveq.l    #0,d0            * for .b = .w
  851.     move.b    d2,d0            * plane&0xff
  852.     move.w    d0,(a1)            * plane
  853.     move.w     4+2+regs(sp),d3    * sx
  854.     move.w     8+2+regs(sp),d4    * sy
  855.     move.w    12+2+regs(sp),d5    * wx
  856.     move.w    16+2+regs(sp),d6    * wy
  857.     move.w    #$ffff,10(a1)        * line style
  858.     * メイン枠
  859.     movem.w    d3-d6,2(a1)
  860.     *move.w    d3,2(a1)        * sx
  861.     *move.w    d4,4(a1)        * sy
  862.     *move.w    d5,6(a1)        * wx
  863.     *move.w    d6,8(a1)        * wy
  864.     IOCS    _TXBOX
  865.     
  866.     lsr.w    #8,d2            * f=(plane>>8) ; 影付き枠線モード
  867.     moveq.l    #2,d2
  868.     * 影1 : tl.x=sx+8; tl.y=sy+wy-1+f; tl.x1=wx-8+f; tl.y1=1;
  869.     addq.w    #8,2(a1)        * x=sx+8
  870.     *
  871.     move.w    d6,d1            * wy
  872.     subq.w    #1,d1            * -1
  873.     add.w    d2,d1            * +f
  874.     add.w    d1,4(a1)        * +sy=y
  875.     *
  876.     subq.w    #8,6(a1)        * wx-8
  877.     add.w    d2,6(a1)        * +f=x1
  878.     *
  879.     move.w    #1,8(a1)        * y1=1
  880.     IOCS    _TXLINE
  881.     *
  882.     * 影2 :    tl.x=sx+wx-1+f; tl.y=sy+8; tl.x1=1; tl.y1=wy-8+f-1;
  883.     add.w    d5,d3            * sx+wx
  884.     subq.w    #1,d3            * -1
  885.     add.w    d2,d3            * +f
  886.     move.w    d3,2(a1)        * =x
  887.     *
  888.     addq.w    #8,d4            * sy+8
  889.     move.w    d4,4(a1)        * =y
  890.     *
  891.     move.w    #1,6(a1)        * x1
  892.     *
  893.     subq.w    #8,d6            * wy-8
  894.     add.w    d2,d6            * +f
  895.     subq.w    #1,d6            * -1
  896.     move.w    d6,8(a1)        * =y1
  897.     IOCS    _TXLINE
  898.     movem.l    (sp)+,d3-d6
  899.     rts
  900.  
  901. *------------------------------------------------------------------------------
  902.  
  903. SetXYs:
  904. * d0.w = x/y座標(in:現在のカーソル座標,out:表示座標)
  905. * d3.w = CDW?
  906. * d4.w = CSR?MAX
  907.     addq.w    #1,d0        * +1座標から
  908.     move.w    d0,d1        * xy
  909.     add.w    d3,d1
  910.     addq.w    #1,d1        * xy+(CDW-1)
  911.     move.w    d4,d2        * w=テキストx/y幅-1
  912.     cmp.w    d2,d1        * xy+CDW-1>w?
  913.     bls    @f        * <= ; 入りきる
  914.     * 入りきらない時
  915.     subq.w    #1,d0        * xy-1
  916.     sub.w    d3,d0        * xy-1>CDW? -> xy-1-CDW>0?
  917.     bgt    @f        * Yes    * V1.2のバグはここ。bhiになってた。
  918.     move.w    d2,d0        * w
  919.     sub.w    d3,d0        * xy=w-CDW+1;
  920.     addq.w    #1,d0        * -(CDW-1)
  921. @@:
  922.     rts
  923.  
  924.  
  925. First2:
  926.     movem.l    d3-d6,-(sp)
  927.     IOCS    _OS_CUROF    * カーソルoff(waku2/画面退避にて重要)
  928.     * 表示座標設定
  929.     move.l    xy(opc),d0    * h.w=x
  930.     swap    d0        * (xy>>16)
  931.     move.w    #CDWX,d3
  932.     move.w    CSRXMAX.w,d4    * IOCSワークエリア
  933.     cmp.w    #96,d4        * ED.R対応
  934.     blt    30f        * wx<96
  935.     moveq.l    #95,d4        * wx>=96 -> wx=95
  936. 30:    bsr    SetXYs        * 表示x座標設定
  937.     *
  938.     move.w    d0,xx        * =xx
  939.     move.l    xy(opc),d0    * l.w=y
  940.     move.w    #CDWY,d3
  941.     move.w    CSRYMAX.w,d4    * IOCSワークエリア
  942.     bsr    SetXYs        * 表示y座標設定
  943.     move.w    d0,yy        * =yy
  944.     * 下画面保存
  945.     moveq.l    #_TEXTGET,d3
  946.     bsr    TextGetPut
  947.     * 画面下消去
  948.     move.w    xx(opc),d3
  949.     move.w    yy(opc),d4
  950.     move.w    d4,d2        * yy
  951.     moveq.l    #CDWY-1,d6    * -1 for dbra
  952. 2:    move.w    d3,d1        * xx
  953.     IOCS    _B_LOCATE    * B_LOCATE(xx,y);
  954.     moveq.l    #CDWX-1,d5    * -1 for dbra
  955.     move.w    #' ',d1
  956. @@:    IOCS    _B_PUTC
  957.     dbra    d5,@b
  958.     addq.w    #1,d2        * y++
  959.     dbra    d6,2b
  960.     *
  961.     pea    $0201.w        * plane
  962.     pea    (CDWY*16-16).w
  963.     pea    (CDWX*8-8).w
  964.     move.w    d4,d0        * yy
  965.     add.w    oy(opc),d0    * +B_CONSOL y-offset
  966.     lsl.w    #4,d0        * *16
  967.     addq.w    #8,d0        * +8
  968.     move.l    d0,-(sp)
  969.     move.w    d3,d0        * xx
  970.     add.w    ox(opc),d0    * +B_CONSOL x-offset
  971.     lsl.w    #3,d0        * *8
  972.     addq.w    #4,d0        * +4
  973.     move.l    d0,-(sp)
  974.     bsr    waku2        * waku2(xx*8+4,yy*16+8,CDWX*8-8,CDWY*16-16,0x201);
  975.     lea    5*4(sp),sp
  976.     *
  977.     * タイトル、キー操作など表示(SCLEN以下のこと)
  978.     move.w    d3,d1        * xx
  979.     addq.w    #2,d1        * xx+2
  980.     move.w    d4,d2        * yy
  981.     IOCS    _B_LOCATE
  982.     lea    Hyou(opc),a1
  983.     IOCS    _B_PRINT    * B_XYPRINT(xx+2,yy,"[ 文字コード表 ]");
  984.     *
  985.     subq.w    #1,d1        * xx=xx+2-1=xx+1
  986.     addq.w    #1,d2        * yy+1
  987.     IOCS    _B_LOCATE
  988.     lea    Scale(opc),a1
  989.     IOCS    _B_PRINT    * B_XYPRINT(xx+1,yy+1,SCALE);
  990.     add.w    #CDWY-3-1,d2    * yy+1+CDWY-3-1
  991.     IOCS    _B_LOCATE
  992.     lea    Scale(opc),a1
  993.     IOCS    _B_PRINT    * B_XYPRINT(xx+1,yy+CDWY-3,SCALE);
  994.     *
  995.     move.w    #TCYAN|REVERSE,d1
  996.     IOCS    _B_COLOR
  997.     move.w    d3,d1        * xx
  998.     addq.w    #1,d1        * xx+1
  999.     addq.w    #1,d2        * 下のScaleの1つ下
  1000.     IOCS    _B_LOCATE
  1001.     lea    Keys(opc),a1
  1002.     IOCS    _B_PRINT    * B_XYPRINT(xx+1,yy+CDWY-3+1,Keys);
  1003.     move.w    #TWHITE,d1
  1004.     IOCS    _B_COLOR
  1005.     *
  1006.     move.w    d3,d1        * xx
  1007.     add.w    #3+SCLEN/2+4,d1
  1008.     move.w    d4,d2        * yy
  1009.     IOCS    _B_LOCATE
  1010.     lea    WShurui(opc),a1
  1011.     IOCS    _B_PRINT    * B_XYPRINT(xx+3+SCLEN/2+4,yy,コード種類表示枠);
  1012.     *
  1013.     clr.b    cbuf        * cbuf[0]=0
  1014.     clr.w    pt
  1015.     clr.w    ptb
  1016.     clr.b    first        * first=0
  1017.     movem.l    (sp)+,d3-d6
  1018.     rts
  1019.  
  1020. *---------------------------------------
  1021.  
  1022. Codes:
  1023. * short Codes(BIT16K key)
  1024. * keyは使っていない
  1025.     cmp.b    #1,first
  1026.     bne    2f
  1027.     * "文字選択"の表示のためだけに一度リターン
  1028.     move.b    #2,first
  1029.     *
  1030.     clr.l    vecTimerC        * ベクターを止めてないの印
  1031.     tst.b    ftimerc
  1032.     beq    @f            * -> Timer-Cはそのまま
  1033.     * Timer-Cのベクターを保存する
  1034.     move.w    #TimerC,-(sp)
  1035.     DOS    _INTVCG
  1036.     addq.l    #2,sp
  1037.     cmp.l    vecTimerC0(pc),d0    * 組み込み時と違う?
  1038.     beq    @f            * 同じ=書き変わってないので止めない
  1039.     * 書き変わっているので止める
  1040.     move.l    d0,vecTimerC
  1041.     * Timer-Cの割り込みを無効にする
  1042.     pea    Ret(pc)
  1043.     move.w    #TimerC,-(sp)
  1044.     DOS    _INTVCS
  1045.     addq.l    #6,sp
  1046.     *
  1047. @@:    move.b    CURMODE.w,cur        * カーソル表示スイッチ記録(<>0で表示)
  1048.     move.l    CURSOR.w,xy        * カーソル座標記録
  1049.     * B_CONSOLのオフセットからテキストレベルのオフセットを計算する
  1050.     move.l    MTXOFST.w,d0
  1051.     move.w    d0,d1
  1052.     and.w    #$7f,d1            * tx (ad%128)
  1053.     move.w    d1,ox
  1054.     lsr.l    #8,d0
  1055.     lsr.l    #3,d0            * 上位ビットの0も兼ねてるので、swap+lsl.l #5にしないこと
  1056.     move.w    d0,oy            * ty (ad/128/16)
  1057.     *
  1058.     moveq.l    #'0',d1
  1059.     bsr    Condrv            * condrv off
  1060.     *
  1061.     bsr    BREAKOFF
  1062.     lea    MesTitle(opc),a0
  1063.     move.l    #mbuf,d0
  1064.     moveq.l    #1,d1            * 反転表示
  1065.     bsr    Str2MEANS        * Str2MEAN("文字選択", mbuf, 1);
  1066.     bsr    BREAKON
  1067.     move.w    #DF_MWINSTR|CACI_URGENT,d0    * 直ぐ戻ってくる
  1068.     rts
  1069.     *
  1070. 2:    cmp.b    #2,first
  1071.     bne    @f
  1072.     bsr    First2
  1073.     *
  1074. @@:    * コード表表示&選択
  1075.     bsr    PrintCodes
  1076.     *
  1077.     cmp.b    #1,first
  1078.     bne    1f
  1079.     move.l    d0,-(sp)        * push d0
  1080.     *
  1081.     moveq.l    #'1',d1
  1082.     bsr    Condrv            * condrv on
  1083.     * 画面復帰
  1084.     moveq.l    #_TEXTPUT,d3
  1085.     bsr    TextGetPut
  1086.     * カーソル座標復帰
  1087.     move.l    xy(opc),CURSOR.w
  1088.     * カーソル表示復帰
  1089.     moveq.l    #_OS_CURON,d0        * cur<>0
  1090.     tst.b    cur
  1091.     bne    @f
  1092.     moveq.l    #_OS_CUROF,d0        * cur=0
  1093. @@:    trap    #15
  1094.     * このカーソル座標復帰と点滅復帰の順を逆にするとカーソルが残ってしまう
  1095.     move.l    vecTimerC(pc),d0    * Timer-Cは止められてる?
  1096.     beq    @f            * -> 止めてない
  1097.     * Timer-Cのベクターを復帰する
  1098.     move.l    d0,-(sp)
  1099.     move.w    #TimerC,-(sp)
  1100.     DOS    _INTVCS
  1101.     addq.l    #6,sp
  1102.     *
  1103. @@:    move.l    (sp)+,d0        * pop d0
  1104. 1:    rts
  1105.  
  1106. Ret:    * <- Timer-Cの飛び先
  1107.     rte                * 何もしない
  1108.  
  1109. *---------------------------------------
  1110.  
  1111. Condrv:
  1112. * 入力 : d1.w == '0' : OFF
  1113. *          == '1' : ON
  1114.     move.l    $40c.w,a0    * KEY_INITのベクター
  1115.     cmp.l    #'hmk*',-4(a0)
  1116.     bne    @f        * なし
  1117.     * condrv.sysあり
  1118.     * condrvのシステムコールによる制御がなぜかうまくいかないのでESC0/1で制御する。
  1119.     * たぶん、KeyWitchの問題だと思う(99/08/29)。
  1120.     * 修正版KeyWitchを使えばいいんだけど、直すのも面倒なのでこのまま。
  1121.     move.w    d1,-(sp)
  1122.     moveq.l    #$1b,d1        * ESC
  1123.     IOCS    _B_PUTC
  1124.     move.w    (sp)+,d1    * '0'/'1'
  1125.     IOCS    _B_PUTC
  1126. @@:    rts
  1127.  
  1128. *---------------------------------------
  1129.  
  1130. TextGetPut:
  1131. * 下画面の保存/復帰
  1132. *    d3=_TEXTGET/_TEXTPUT
  1133.     moveq.l    #BIT1,d1
  1134.     IOCS    _TCOLOR
  1135.     move.l    plane1(opc),a1
  1136.     bsr    @f        * plane 1
  1137.     *
  1138.     moveq.l    #BIT0,d1
  1139.     IOCS    _TCOLOR
  1140.     move.l    plane0(opc),a1
  1141. @@:    move.w    #CDWX*8,(a1)    * xl
  1142.     move.w    #CDWY*16,2(a1)    * yl
  1143.     move.w    xx(opc),d1
  1144.     add.w    ox(opc),d1    * B_CONSOL x-offset
  1145.     lsl.w    #3,d1        * 8
  1146.     move.w    yy(opc),d2
  1147.     add.w    oy(opc),d2    * B_CONSOL y-offset
  1148.     lsl.w    #4,d2        * 16
  1149.     move.l    d3,d0
  1150.     trap    #15
  1151.     rts
  1152.  
  1153. *******************************************************************************
  1154. * ワーク2
  1155. *******************************************************************************
  1156. * ここに置くワークは、常駐後に使われるもの
  1157. * これらのワークエリアは常駐後に利用可能になるので、
  1158. * 以下の非常駐ルーチンからは参照しないこと
  1159. *------------------------------------------------------------------------------
  1160. * オフセットテーブルの定義
  1161.     .offset    0
  1162. *---------------------------------------
  1163. * 状態変数
  1164.  
  1165. _brksts        .ds.w    1    * BREAK状態
  1166.  
  1167. *---------------------------------------
  1168. * 変数
  1169. _pt        .ds.w    1    * cbuf[]への今回のストア;文字数目
  1170. _ptb        .ds.w    1    * cbuf[]への今回のストア;バイト位置
  1171. _pts        .ds.b    C_SIZE    * cbuf[]への全ストアポイント(文字毎)
  1172.         .even
  1173.  
  1174. _vecTimerC    .ds.l    1    * 元TimerCベクター
  1175. _xy        .ds.l    1    * 元カーソル座標x,y
  1176. _xx        .ds.w    1    * 表示x座標
  1177. _yy        .ds.w    1    * 表示y座標
  1178. _ox        .ds.w    1    * B_CONSOL x-offset
  1179. _oy        .ds.w    1    * B_CONSOL y-offset
  1180. _cur        .ds.b    1    * カーソル点滅状態
  1181.  
  1182.         .even
  1183. _Twork:                * kbufを使う(K_SIZE>2*6なので大丈夫)
  1184.  
  1185. *---------------------------------------
  1186. * アクセサリバッファー
  1187.  
  1188. _kbuf        .ds.w    K_SIZE        * 変換ラインへ
  1189. _mbuf        .ds.w    M_SIZE        * モード表示領域へ
  1190. _cbuf        .ds.b    C_SIZE        * 仮入力行 -> 入力行へ(ユーザーの入力へ)
  1191.  
  1192. *---------------------------------------
  1193.  
  1194. _keep_end1:    *    常駐部分最後(通常時)
  1195.  
  1196. *---------------------------------------
  1197. * 下画面退避バッファー;/Mの時のみ確保される
  1198.  
  1199.         .even
  1200. _plane00:
  1201.     .ds.w    1        * WORD    xl;
  1202.     .ds.w    1        * WORD    yl;
  1203.     .ds.b    CDWX*CDWY*16    * UBYTE    buffer[CDWX*CDWY*16];
  1204.  
  1205. _plane10:
  1206.     .ds.w    1        * WORD    xl;
  1207.     .ds.w    1        * WORD    yl;
  1208.     .ds.b    CDWX*CDWY*16    * UBYTE    buffer[CDWX*CDWY*16];
  1209.  
  1210. *---------------------------------------
  1211.  
  1212. _keep_end2:    *    常駐部分最後(fget=0時)
  1213.  
  1214. *------------------------------------------------------------------------------
  1215. * 実際のワークエリアの定義
  1216. *------------------------------------------------------------------------------
  1217.  
  1218.     .text    * .offset解除
  1219. work2:
  1220.  
  1221. * 状態変数
  1222. brksts        equ    work2+_brksts
  1223.  
  1224. * 変数
  1225. pt        equ    work2+_pt
  1226. ptb        equ    work2+_ptb
  1227. pts        equ    work2+_pts
  1228.  
  1229. vecTimerC    equ    work2+_vecTimerC
  1230. xy        equ    work2+_xy
  1231. xx        equ    work2+_xx
  1232. yy        equ    work2+_yy
  1233. ox        equ    work2+_ox
  1234. oy        equ    work2+_oy
  1235. cur        equ    work2+_cur
  1236. Twork        equ    work2+_Twork
  1237.  
  1238. * アクセサリバッファー
  1239. kbuf        equ    work2+_kbuf
  1240. mbuf        equ    work2+_mbuf
  1241. cbuf        equ    work2+_cbuf
  1242.  
  1243. keep_end1    equ    work2+_keep_end1    * 常駐部分最後(通常時)
  1244.  
  1245. * 下画面退避バッファー;/Mの時のみ確保される
  1246. plane00        equ    work2+_plane00
  1247. plane10        equ    work2+_plane10
  1248.  
  1249. keep_end2    equ    work2+_keep_end2    * 常駐部分最後(/M時)
  1250.  
  1251. *******************************************************************************
  1252. *    非常駐ルーチン
  1253. *******************************************************************************
  1254. * アクセサリ定義構造体
  1255. *******************************************************************************
  1256.  
  1257.     .even
  1258. ACdef    .dc.w    KS_EDIT0            * いつ呼び出されるか    +0
  1259.     .dc.w    SHIFT_ON|NOT_ASCII|KIGOU_KEY    * 呼びだしキー        +2
  1260.                         * -KではSHIFT_ON不要
  1261.     .dc.l    Codes                * アクセサリーメイン
  1262.     * ASK <-> アクセサリ文字列受け渡し
  1263.     .dc.l    cbuf
  1264.     .dc.l    kbuf
  1265.     .dc.l    mbuf
  1266. *
  1267. *******************************************************************************
  1268. *    アクセサリ 組み込み/解除/初期化
  1269. *******************************************************************************
  1270.  
  1271. DeleteAcc:
  1272. * 入力:a2 = ACh
  1273. * 出力:d0.l = 0:ok , !=0:エラー
  1274. * 破壊:d0
  1275.     move.l    a0,-(sp)        * push a0
  1276.     lea    MesCodes(pc),a0
  1277.     bsr    Print
  1278.     move.l    (a2),-(sp)        * ACh
  1279.     pea    61.w
  1280.     DOS    _KNJCTRL
  1281.     addq.l    #4*2,sp
  1282.     lea    MesDeleteOk(pc),a0    * ok message
  1283.     tst.l    d0
  1284.     beq    @f            * ret=0:Ok
  1285.     lea    ErrCantDelete(pc),a0    * error
  1286. @@:    bsr    Print
  1287.     move.l    (sp)+,a0        * pop a0
  1288.     rts
  1289.  
  1290. *******************************************************************************
  1291.  
  1292. AttachAcc:
  1293. * アクセサリの登録
  1294. * 入力:なし
  1295. * 出力:d0.l = 0:ok , !=0:エラー
  1296. * 破壊:d0,d1,a0
  1297.     * ASKのバージョンチェック
  1298.     pea    50.w
  1299.     DOS    _KNJCTRL
  1300.     addq.l    #4,sp
  1301.     cmp.l    #300,d0        * <300? (V3.00未満?)
  1302.     bcc    @f        * No (V3.00以降)
  1303.     * ASK V3.00以降でない
  1304.     lea    ErrASK3(pc),a0
  1305.     moveq.l    #3,d0        * return(3)
  1306.     bra    1f
  1307. *
  1308. @@:    * アクセサリの登録
  1309.     lea    MesCodes(pc),a0
  1310.     bsr    Print
  1311.     pea    ACdef(pc)
  1312.     pea    60.w
  1313.     DOS    _KNJCTRL
  1314.     addq.l    #4*2,sp
  1315.     cmp.l    #-1,d0        * error?
  1316.     bne    @f        * no
  1317.     * アクセサリに登録出来ない
  1318.     lea    ErrCantAttach(pc),a0
  1319.     moveq.l    #4,d0        * return(4)
  1320.     bra    1f
  1321. *
  1322. @@:    move.l    d0,ACh        * ACh=ret;
  1323.     lea    MesAttachOk(pc),a0
  1324.     moveq.l    #0,d0        * return(0)
  1325. 1:    bsr    Print
  1326.     rts
  1327.  
  1328. ******************************************************************************
  1329.  
  1330. EPrint:
  1331. * エラー出力に表示する
  1332. * 表示は全てこれで行っている
  1333. * 入力:a0 = 文字列
  1334. * 破壊:なし
  1335.     move.l    d0,-(sp)    * push d0
  1336.     move.w    #2,-(sp)    * STDERR
  1337.     pea    (a0)        * 文字列
  1338.     DOS    _FPUTS        * エラー出力へ
  1339.     addq.l    #2+4,sp
  1340.     move.l    (sp)+,d0    * pop d0
  1341.     rts
  1342.  
  1343. Print:
  1344. * 標準出力に表示する(リダイレクト可)
  1345. * 入力:a0 = 文字列
  1346. * 破壊:なし
  1347.     move.l    d0,-(sp)    * push d0
  1348.     pea    (a0)        * 文字列
  1349.     DOS    _PRINT
  1350.     addq.l    #4,sp
  1351.     move.l    (sp)+,d0    * pop d0
  1352.     rts
  1353.  
  1354. ******************************************************************************
  1355. * この中ではa0/a2は壊さないこと(プロセス管理ポインタ/コマンドラインを参照するため)
  1356.  
  1357. AMAX    equ    10    * 最大引数数
  1358.  
  1359. * コマンドライン
  1360. * a2
  1361. * 0(a2)   = コマンドライン長
  1362. * 1(a2)~ = コマンドライン
  1363. *        '-r ',0    スペース/タブはそのまま
  1364. *
  1365. GetArgv:
  1366. * コマンドラインを解析して各要素の先頭アドレスをargvに、個数をargcに格納する
  1367. * 引数:a2   = コマンドライン
  1368. * 出力:d0.w = 引数数(=argc)
  1369. * 破壊:d0-d1
  1370.     movem.l    a2/a6,-(sp)
  1371.     moveq.l    #0,d1        * 引数の数
  1372.     tst.b    (a2)+        * コマンドライン長を飛ばす
  1373.     beq    2f        * コマンドライン長=0 -> 引数なし
  1374.     lea    argv(pc),a6
  1375. @@:    * SPC/TAB skip
  1376.     move.b    (a2)+,d0
  1377.     beq    2f        * コマンドライン終わり
  1378.     cmp.b    #SPC,d0        * skip SPC
  1379.     beq    @b
  1380.     cmp.b    #TAB,d0        * skip TAB
  1381.     beq    @b
  1382.     * SPC/TAB以外の文字が有った
  1383.     subq.l    #1,a2
  1384.     move.l    a2,(a6)+    * argv記録
  1385.     addq.w    #1,d1        * 引数+1
  1386.     cmp.w    #AMAX,d1    * 最大数を越える?
  1387.     bcc    2f        * -> 越える
  1388. 1:    * 次のEOS/SPC/TABまで飛ばす
  1389.     move.b    (a2)+,d0
  1390.     beq    2f        * コマンドライン終わり
  1391.     cmp.b    #SPC,d0        * skip SPC
  1392.     beq    @b
  1393.     cmp.b    #TAB,d0        * skip TAB
  1394.     bne    1b
  1395.     bra    @b
  1396.     *
  1397. 2:    move.w    d1,argc        * 記録
  1398.     move.w    d1,d0
  1399.     movem.l    (sp)+,a2/a6
  1400.     rts
  1401.  
  1402. *---------------------------------------------
  1403.  
  1404. CheckOption:
  1405. * コマンドラインから指定オプションを探す
  1406. * 必ずGetArgvを呼び出した後に使うこと
  1407. * オプション名は先頭1文字だけで判別
  1408. * 引数:d2.b = オプション名(英小文字1文字)
  1409. * 出力:d0.l = 0:なし , !=0:そのオプションの次のアドレス
  1410. * 破壊:d0-d1
  1411.     movem.l    a5-a6,-(sp)
  1412.     move.w    argc(pc),d1
  1413.     beq    1f        * 引数はない
  1414.     subq.w    #1,d1        * -1 for dbra
  1415.     lea    argv(pc),a6
  1416. @@:    move.l    (a6)+,a5    * argv[i]
  1417.     move.b    (a5)+,d0    * argv[i][0]
  1418.     * オプションの1文字目は'/''-'
  1419.     cmp.b    #'/',d0
  1420.     beq    2f
  1421.     cmp.b    #'-',d0
  1422.     beq    2f
  1423. 3:    dbra    d1,@b        * 次へ
  1424. 1:    * (指定)オプションはない
  1425.     moveq.l    #0,d0
  1426.     bra    4f
  1427.  
  1428. 2:    * '/''-'があった
  1429.     move.b    (a5)+,d0    * 次の1文字
  1430.     or.b    #$20,d0        * 英小文字化
  1431.     cmp.b    d2,d0        * 一致?
  1432.     bne    3b        * -> 不一致
  1433.     move.l    a5,d0        * オプション名の次のアドレス(!=0)
  1434. 4:    movem.l    (sp)+,a5-a6
  1435.     rts
  1436.  
  1437. ******************************************************************************
  1438. *    メイン
  1439. ******************************************************************************
  1440.  
  1441.     .xref    keepchk
  1442.     .if EX68
  1443.     .xref    _ChkEX68
  1444.     .endif
  1445.  
  1446. main:
  1447.     lea.l    initsp(pc),sp    * PROGRAM=の時のため
  1448.     
  1449.     * タイトル表示
  1450.     move.w    #2,-(sp)    * STDERR
  1451.     pea    title(pc)    * 文字列
  1452.     DOS    _FPUTS        * エラー出力へ
  1453.     addq.l    #2+4,sp
  1454.     *
  1455.     .if EX68
  1456.     jbsr    _ChkEX68    * EX68のチェック
  1457.     bne    Err_EX68    * 動作不可とする(将来外す可能性はある)
  1458.     .endif
  1459.     *
  1460.     move.l    #(id-KEEP_START),-(sp)    * 識別子の相対位置
  1461.     pea.l    (a0)        * 自分のメモリ管理ポインタ
  1462.     bsr    keepchk        * 常駐チェック
  1463.     addq.l    #4*2,sp
  1464.     move.b    d0,d7        * d7 :0=常駐してない , -1=常駐している
  1465.     
  1466.     * 引数チェック1
  1467.     bsr    GetArgv        * argc/argv設定
  1468.     moveq.l    #'r',d2        * -r : 常駐解除?
  1469.     bsr    CheckOption
  1470.     tst.l    d0
  1471.     beq    keep        * no
  1472. *
  1473. * 常駐解除
  1474. *
  1475.     tst.b    d7        * 常駐している?
  1476.     beq    Err_NoKp    * No -> error
  1477.     
  1478.     * a0=常駐しているルーチンのメモリ管理ポインタ
  1479.     * メモリー管理ポインタを飛ばし、ユーザープログラム先頭へ
  1480.     * さらに、AChまで飛ばす
  1481.     lea.l    ACh-KEEP_START+PSPSIZ(a0),a2    * AChのアドレス
  1482.     bsr    DeleteAcc    * アクセサリ解除
  1483.     tst.l    d0
  1484.     bne    Err_Kai        * アクセサリ登録削除不可により常駐解除不可
  1485.     *
  1486.     pea.l    MPSIZ(a0)
  1487.     DOS    _MFREE        * 自己プロセスメモリー解放
  1488.     addq.l    #4,sp
  1489.     tst.l    d0
  1490.     bmi    Err_Kai        * なぜかメモリー解放出来ない時
  1491.     *
  1492.     * 常駐解除正常終了
  1493.     lea    MesRelease(pc),a0
  1494.     bsr    Print
  1495.     clr.w    -(sp)        * exit(0)
  1496.     DOS    _EXIT2
  1497.  
  1498. keep:    * 常駐
  1499.     tst.b    d7        * 常駐している?
  1500.     bne    Err_Dbl        * Yes -> error(2重常駐)
  1501.     *
  1502.     moveq.l    #'c',d2        * -c : 起動時にTimer-Cを止める
  1503.     bsr    CheckOption
  1504.     move.b    d0,ftimerc
  1505.     * Timer-Cのベクターを保存する
  1506.     move.w    #TimerC,-(sp)
  1507.     DOS    _INTVCG
  1508.     addq.l    #2,sp
  1509.     move.l    d0,vecTimerC0    * 組み込み時のTimer-C
  1510.     *
  1511.     * 画面退避アドレス設定
  1512.     moveq.l    #'m',d2        * -m : メインメモリに画面退避バッファー確保
  1513.     bsr    CheckOption
  1514.     lea    plane00(opc),a0    * メインメモリ
  1515.     lea    plane10(opc),a1
  1516.     move.l    #keep_end2-KEEP_START,d7    * 常駐サイズ
  1517.     tst.l    d0
  1518.     bne    @f        * -mあり
  1519.     move.l    #$e50000,a0    * テキスト未使用領域
  1520.     move.l    #$e50000+2*2+CDWX*CDWY*16,a1
  1521.     move.l    #keep_end1-KEEP_START,d7    * 常駐サイズ
  1522. @@:    move.l    a0,plane0
  1523.     move.l    a1,plane1
  1524.     *
  1525.     * 起動キーを変える?(V1.1)
  1526.     moveq.l    #'k',d2        * -k : 起動キーを[記号入力]のみにする
  1527.     bsr    CheckOption
  1528.     tst.l    d0
  1529.     beq    @f        * -kなし
  1530.     move.w    #NOT_ASCII|KIGOU_KEY,ACdef+2
  1531.     *
  1532. @@:    * アクセサリ組み込み
  1533.     bsr    AttachAcc
  1534.     tst.l    d0
  1535.     bne    Err_Keep    * 組み込みエラー
  1536.     *
  1537.     * アクセサリも組み込みOK
  1538.     lea    MesKeep(pc),a0
  1539.     bsr    Print
  1540.     clr.w    -(sp)        * exit(0)相当
  1541.     move.l    d7,-(sp)    * 常駐サイズ
  1542.     DOS    _KEEPPR
  1543. *
  1544. * エラー終了
  1545. *
  1546. .if EX68
  1547. Err_EX68:    * EX68上である
  1548.     lea.l    ErrEX68(pc),a0
  1549.     bra.s    error
  1550. .endif
  1551. Err_NoKp:    * 常駐していないのに解除しようとした
  1552.     lea.l    NoKeep(pc),a0
  1553.     bra.s    error
  1554. Err_Dbl:    * 2重常駐
  1555.     lea.l    AlreadyKeep(pc),a0
  1556.     bra.s    error
  1557. Err_Keep:    * 常駐できない
  1558.     lea.l    CantKeep(pc),a0
  1559.     bra.s    error
  1560. Err_Kai:    * 常駐解除不可
  1561.     lea.l    CantRelease(pc),a0
  1562.     bra.s    error
  1563. usage:    * 使用法
  1564.     lea.l    MesUsage(pc),a0
  1565. error:    bsr    EPrint        * エラー出力へ表示
  1566. erRet:    move.w    #2,-(sp)    * exit(2)
  1567.     DOS    _EXIT2
  1568.  
  1569. ******************************************************************************
  1570. * メッセージなど
  1571. ******************************************************************************
  1572.  
  1573.     .even
  1574. MesCodes:    .dc.b    'アクセサリ「文字選択」',0
  1575. MesDeleteOk:    .dc.b    'を削除しました',$0d,$0a,0
  1576. ErrCantDelete:    .dc.b    'が削除できません',$0d,$0a,0
  1577. ErrCantAttach:    .dc.b    'が登録できません',$0d,$0a,0
  1578. MesAttachOk:    .dc.b    'を登録しました',$0d,$0a,0
  1579. ErrASK3:    .dc.b    'ASK v3/codeAではありません',$0d,$0a,0
  1580.  
  1581. title:        .dc.b    'ASK3/codeAアクセサリ ASKCodes V1.31',$0d,$0a
  1582.         .dc.b    $09,'Copyright 1998-99 by AIG-Soft'    * CrLfにつながる
  1583. CrLf        .dc.b    $0d,$0a
  1584. Eoss        .dc.b    0
  1585. MesKeep:    .dc.b    '常駐しました',$0d,$0a,0
  1586. MesRelease:    .dc.b    '常駐解除しました',$0d,$0a,0
  1587. NoKeep:        .dc.b    '常駐していません',$0d,$0a,0
  1588. AlreadyKeep:    .dc.b    'すでに常駐しています',$0d,$0a,0
  1589. CantKeep:    .dc.b    '常駐できません',$0d,$0a,0
  1590. CantRelease:    .dc.b    '常駐解除できません',$0d,$0a,0
  1591. .if EX68
  1592. ErrEX68        .dc.b    'EX68上では組み込めません',$0d,$0a,0
  1593. .endif
  1594. MesUsage:    .dc.b    'ASKCodes [/R /M /K /C]',$0d,$0a,0
  1595.  
  1596.     .even
  1597. argc        .ds.w    1        * 引数の個数
  1598. argv        .ds.l    AMAX        * 各引数の先頭アドレス
  1599.  
  1600. ******************************************************************************
  1601. * 非常駐ルーチンが使うスタック
  1602. ******************************************************************************
  1603.     .stack
  1604.     .even
  1605.     .ds.l    512
  1606. initsp:
  1607. ******************************************************************************
  1608.     .end    main
  1609.